package DevCode.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import DevCode.Excepcion.DAOExcepcion;
import DevCode.Modelo.Idea;
import DevCode.Util.ConexionBD;

public class IdeaDAO extends BaseDAO {
	
	public Collection<Idea> listarIdeaPermitidas(int USicodigo, int IDicodigo, int busqueda)
			throws DAOExcepcion {
		String query;
		if(busqueda == 1){
			query = "select IDicodigo, IDvtitulo, IDvdescripcion, IDdfechahora, concat(USvnombres,' ',USvapaterno,' ',USvamaterno) as IDvnombreCompleto, "
					+ "(select count(*) from comentario where Idea_IDicodigo = IDicodigo) as IDinumeroComentarios, "
					+ "(select sum(PEicalificacion) from permitido where Idea_IDicodigo = IDicodigo) as IDipuntuacion "
					+ "from idea i, usuario u, permitido p "
					+ "where i.Usuario_USicodigo_Idea = u.USicodigo and i.IDicodigo = p.Idea_IDicodigo and p.Usuario_USicodigo = ?";
		}else{
			query = "select IDicodigo, IDvtitulo, IDvdescripcion, IDdfechahora, concat(USvnombres,' ',USvapaterno,' ',USvamaterno) as IDvnombreCompleto, "
					+ "(select count(*) from comentario where Idea_IDicodigo = IDicodigo) as IDinumeroComentarios, "
					+ "(select sum(PEicalificacion) from permitido where Idea_IDicodigo = IDicodigo) as IDipuntuacion "
					+ "from idea i, usuario u, permitido p "
					+ "where i.Usuario_USicodigo_Idea = u.USicodigo and i.IDicodigo = p.Idea_IDicodigo and p.Usuario_USicodigo = ? and IDicodigo = ?";
		}
		Collection<Idea> lista = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, USicodigo);
			if(busqueda == 0){
				stmt.setInt(2, IDicodigo);
			}
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea i = new Idea();
				i.setIDicodigo(rs.getInt("IDicodigo"));
				i.setIDvtitulo(rs.getString("IDvtitulo"));
				i.setIDvdescripcion(rs.getString("IDvdescripcion"));
				i.setIDdfechahora(rs.getString("IDdfechahora"));
				i.setIDvnombreCompleto(rs.getString("IDvnombreCompleto"));
				i.setIDinumeroComentarios(rs.getInt("IDinumeroComentarios"));
				i.setIDipuntuacion(rs.getInt("IDipuntuacion"));
				lista.add(i);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;		
	}
	
	public Idea obtenerIdea(int IDicodigo) throws DAOExcepcion {
		String query = "SELECT `IDicodigo`, `IDvtitulo`, `IDvdescripcion`, `IDvpalabra1`, `IDvpalabra2`, `IDvpalabra3`,"
				+ " `IDvpalabra4`, `IDvarchivo`, `IDdfechahora`, `IDvestado`, `Usuario_USicodigo_Idea`, `Usuario_USicodigo_Tutor` "
				+ "FROM `idea` WHERE `IDicodigo` = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Idea i = new Idea();
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, IDicodigo);
			rs = stmt.executeQuery();
			if (rs.next()) {
				i.setIDicodigo(rs.getInt("IDicodigo"));
				i.setIDvtitulo(rs.getString("IDvtitulo"));
				i.setIDvdescripcion(rs.getString("IDvdescripcion"));
				i.setIDvpalabra1(rs.getString("IDvpalabra1"));
				i.setIDvpalabra2(rs.getString("IDvpalabra2"));
				i.setIDvpalabra3(rs.getString("IDvpalabra3"));
				i.setIDvpalabra4(rs.getString("IDvpalabra4"));
				i.setIDvarchivo(rs.getString("IDvarchivo"));
				i.setIDdfechahora(rs.getString("IDdfechahora"));
				i.setIDvestado(rs.getString("IDvestado"));
				i.setUSicodigo_Idea(rs.getInt("Usuario_USicodigo_Idea"));
				i.setUSicodigo_Tutor(rs.getInt("Usuario_USicodigo_Tutor"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return i;
	}
	
	public Collection<Idea> buscarFilterIdea(String IDvtitulo,String IDvestado,int busqueda)
			throws DAOExcepcion {
		String query;
		if(busqueda == 1){			
				query = "SELECT i.*, CONCAT(USvapaterno, ' ', USvamaterno,' ', USvnombres) as IDvnombreCompleto "
						+ " FROM `idea` i inner join usuario u on u.USicodigo = i.Usuario_USicodigo_Idea where IDvtitulo like ?";
			}else{
				query = "SELECT i.*, CONCAT(USvapaterno, ' ', USvamaterno,' ', USvnombres) as IDvnombreCompleto "
						+ " FROM `idea` i inner join usuario u on u.USicodigo = i.Usuario_USicodigo_Idea where IDvestado =?";
		}		
		Collection<Idea> listaFilter = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);						
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea i = new Idea();
				i.setIDicodigo(rs.getInt("IDicodigo"));
				i.setIDvtitulo(rs.getString("IDvtitulo"));
				i.setIDvdescripcion(rs.getString("IDvdescripcion"));
				i.setIDvpalabra1(rs.getString("IDvpalabra1"));
				i.setIDvpalabra2(rs.getString("IDvpalabra2"));
				i.setIDvpalabra3(rs.getString("IDvpalabra3"));
				i.setIDvpalabra4(rs.getString("IDvpalabra4"));
				i.setIDvarchivo(rs.getString("IDvarchivo"));
				i.setIDdfechahora(rs.getString("IDdfechahora"));
				i.setIDvestado(rs.getString("IDvestado"));
				i.setUSicodigo_Idea(rs.getInt("Usuario_USicodigo_Idea"));
				i.setUSicodigo_Tutor(rs.getInt("Usuario_USicodigo_Tutor"));
				i.setIDvnombreCompleto(rs.getString("IDvnombreCompleto"));
				listaFilter.add(i);				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return listaFilter;
	}
	
	public Collection<Idea> buscarIdea(int USicodigo)
			throws DAOExcepcion {
		String query;		
			query = "select IDicodigo, IDvtitulo, IDvdescripcion, IDvpalabra1, IDvpalabra2, "
					+ "IDvpalabra3, IDvpalabra4, IDvarchivo, IDdfechahora, IDvestado, "
					+ "Usuario_USicodigo_Idea from idea where IDvestado <> 'Rechazada' and Usuario_USicodigo_Idea=?";
		Collection<Idea> lista = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);	
			stmt.setInt(1, USicodigo);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea i = new Idea();
				i.setIDicodigo(rs.getInt("IDicodigo"));
				i.setIDvtitulo(rs.getString("IDvtitulo"));
				i.setIDvdescripcion(rs.getString("IDvdescripcion"));
				i.setIDvpalabra1(rs.getString("IDvpalabra1"));
				i.setIDvpalabra2(rs.getString("IDvpalabra2"));
				i.setIDvpalabra3(rs.getString("IDvpalabra3"));
				i.setIDvpalabra4(rs.getString("IDvpalabra4"));
				i.setIDvarchivo(rs.getString("IDvarchivo"));
				i.setIDdfechahora(rs.getString("IDdfechahora"));
				i.setIDvestado(rs.getString("IDvestado"));
				i.setUSicodigo_Idea(rs.getInt("Usuario_USicodigo_Idea"));	
				lista.add(i);				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public Collection<Idea> ConsultarIdea(String IDvtitulo)
			throws DAOExcepcion {
		String query = "Select IDicodigo, IDvtitulo from idea where IDvtitulo=?";
		Collection<Idea> lista = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, IDvtitulo);	
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea i = new Idea();
				i.setIDicodigo(rs.getInt("IDicodigo"));
				i.setIDvtitulo(rs.getString("IDvtitulo"));
				lista.add(i);				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public void eliminarIdea(int IDicodigo) throws DAOExcepcion {
		String query = "delete from idea where IDicodigo=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, IDicodigo);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar idea");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Idea guardarIdea(Idea id, int ope) throws DAOExcepcion {
		String query="";
		if (ope == 1){
			query = "insert into idea(`IDvtitulo`,`IDvdescripcion`,`IDvpalabra1`,`IDvpalabra2`,`IDvpalabra3`,`IDvpalabra4`,`IDvarchivo`,"
					+ "`IDdfechahora`,`IDvestado`,`Usuario_USicodigo_Idea`) values (?,?,?,?,?,?,?,?,?,?)";
		}else{
			query = "update idea set IDvtitulo=?, IDvdescripcion=?, IDvpalabra1=?, IDvpalabra2=?, IDvpalabra3=?, IDvpalabra4=?, IDvarchivo=?, "
					+ "IDdfechahora=?, IDvestado=?,Usuario_USicodigo_Idea=? where IDicodigo=?";
		}
		Idea idea = new Idea();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, id.getIDvtitulo());
			stmt.setString(2, id.getIDvdescripcion());
			stmt.setString(3, id.getIDvpalabra1());
			stmt.setString(4, id.getIDvpalabra2());
			stmt.setString(5, id.getIDvpalabra3());
			stmt.setString(6, id.getIDvpalabra4());
			stmt.setString(7, id.getIDvarchivo());
			stmt.setString(8, id.getIDdfechahora());
			stmt.setString(9, id.getIDvestado());
			stmt.setInt(10, id.getUSicodigo_Idea());
			if (ope != 1){
				stmt.setInt(11, id.getIDicodigo());
			}
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar / atualizar una idea");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}				
		return idea;
	}

}
